﻿using Ext.Net;
using Ext.Net.MVC;
using PcaCaja.BOL;
using PcaCaja.DAL;
using PcaCore.DAL.Log;
using PcaWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PcaWeb.Areas.Caja.Controllers
{
    [DirectController(AreaName = "Caja")]
    public class GrupoMovimientoController : ControllerUser
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetAll(int start, int limit, string query, string tipoMovimientoId, string grupoId)
        {
            if (string.IsNullOrEmpty(grupoId))
            {
                int total;
                IEnumerable<object> records = dGrupoMovimiento.GetList(start, limit, out total, tipoMovimientoId, dSesion.GetEmpresaId(), query);
                return Json(new { data = records, total = total }, JsonRequestBehavior.AllowGet);
            }
            else
            {
                oGrupoMovimiento grupo = dGrupoMovimiento.Get(Convert.ToInt64(grupoId), dSesion.GetEmpresaId());
                return Json(new { data = grupo, total = (grupo == null) ? 0 : 1 }, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult GetList(StoreRequestParameters parameters, string tipoMovimientoId)
        {
            int total;
            List<oGrupoMovimiento> grupos = dGrupoMovimiento.GetList(parameters.Start, parameters.Limit, out total, tipoMovimientoId, dSesion.GetEmpresaId());
            return this.Store(grupos, total);
        }

        public Ext.Net.MVC.PartialViewResult FrmRegistrar(string tipoMovimientoId)
        {
            ViewBag.tipoMovimientoId = tipoMovimientoId;

            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmRegistrar",
                ViewData = ViewData
            };
        }

        private Ext.Net.MVC.PartialViewResult FrmEditar(oGrupoMovimiento grupo)
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmEditar",
                Model = grupo
            };
        }

        private ActionResult ConfirmarEliminar(oGrupoMovimiento grupo)
        {
            try
            {
                MessageBoxConfig config = new MessageBoxConfig();
                config.Title = "Confirmacion";
                config.Message = string.Format("Eliminar grupo \"{0}\"", grupo.nombre);
                config.Closable = false;
                config.Icon = MessageBox.Icon.QUESTION;
                config.Buttons = MessageBox.Button.YESNO;
                config.MessageBoxButtonsConfig = new MessageBoxButtonsConfig
                {
                    Yes = new MessageBoxButtonConfig { Handler = string.Format("GrupoMovimiento.Caja.Eliminar(\"{0}\")", grupo.grupo_movimiento_id), Text = "Si" },
                    No = new MessageBoxButtonConfig { Text = "No" }
                };

                X.Msg.Show(config);
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [DirectMethod(Namespace = "GrupoMovimiento")]
        public ActionResult Eliminar(long? grupoMovimientoId)
        {
            try
            {
                dGrupoMovimiento.Delete(Convert.ToInt64(grupoMovimientoId), dSesion.GetEmpresaId());
                this.GetCmp<Store>("storeGruposMovimiento").Reload();
                this.GetCmp<Panel>("pnlSubGruposMovimiento").Hide();
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult Registrar(oGrupoMovimiento model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    model.empresa_id = dSesion.GetEmpresaId();
                    model.oficina_id = dSesion.GetOficinaId();
                    model.sesion_id = dSesion.GetId();
                    dGrupoMovimiento.Insert(model);  
                    return Json(new { success = true });
                }
                catch (Exception ex)
                {
                    return Json(new { success = false, msg = ex.Message });
                }
            }
            return Json(new { success = false, msg = "No se envio informacion correctamente." });
        }

        [HttpPost]
        public ActionResult Actualizar(oGrupoMovimiento model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    model.empresa_id = dSesion.GetEmpresaId();
                    model.oficina_id = dSesion.GetOficinaId();
                    model.sesion_id = dSesion.GetId();
                    dGrupoMovimiento.Update(model);
                    return Json(new { success = true });
                }
                catch (Exception ex)
                {
                    return Json(new { success = false, msg = ex.Message });
                }
            }
            return Json(new { success = false, msg = "No se envio informacion correctamente." });
        }

        private ActionResult ShowSubGruposMovimientos(oGrupoMovimiento grupo)
        {
            try
            {
                this.GetCmp<Panel>("GridSubGruposMovimiento").SetTitle(String.Format("Sub grupos para \"{0}\"", grupo.nombre));
                this.GetCmp<Panel>("GridSubGruposMovimiento").Show();
                this.GetCmp<Hidden>("grupoMovimientoId").SetValue(grupo.grupo_movimiento_id);
                this.GetCmp<Store>("storeSubGruposMovimiento").Reload();
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult RunCommandGrid(string commandName, long? grupoMovimientoId)
        {
            oGrupoMovimiento grupo = dGrupoMovimiento.Get(Convert.ToInt64(grupoMovimientoId), dSesion.GetEmpresaId());

            if (grupo == null)
                return Json(new { success = false, msg = "El grupo ya no existe en la base de datos, posiblemente fue eliminado por otro usuario" });
            
            switch (commandName)
            {
                case "cmdEditar":
                    return FrmEditar(grupo);
                case "cmdEliminar":
                    return ConfirmarEliminar(grupo);
                case "cmdEditarSubGrupos":
                    return ShowSubGruposMovimientos(grupo);
                default:
                    return Json(new { success = false, msg = String.Format("\"{0}\" no es un comando valido", commandName) });
            }
        }
    }
}
